---
id: Nginx进程模型
sidebar_position: 2.4
description: Nginx启动后默认会有两个进程，master是领导者，worker是真正进行工作的进程。
---
## Nginx进程模型
Nginx启动后默认会有两个进程，master是领导者，worker是真正进行工作的进程。

* master进程：主进程
* worker进程：工作进程，是为master进行服务的。
通过 ps-ef | grep nginx命令查看 nginx 进程

```shell
[root@iZ2zeausm2jefqqtmpikzqZ ~]# ps -ef | grep nginx
root      4608  4222  0 Jul21 ?        00:00:00 runsv nginx
root      4621  4608  0 Jul21 ?        00:00:00 svlogd -tt /var/log/gitlab/nginx
root      4623  4608  0 Jul21 ?        00:00:00 nginx: master process /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx
polkitd   4667  4623  0 Jul21 ?        00:00:00 nginx: worker process
polkitd   4668  4623  0 Jul21 ?        00:00:00 nginx: worker process
polkitd   4669  4623  0 Jul21 ?        00:00:00 nginx: worker process
polkitd   4670  4623  0 Jul21 ?        00:01:11 nginx: worker process
```
nginx 在启动之后会产生一个master进程，默认一个worker进程。在./conf/nginx.conf配置文件中可以配置worker进程数。
```shell
worker_processes 2;

```
master会专门接受一些来自外界的指令，然后把这些指令传递给 worker执行，如果worker发生了异常退出了，那么 master 会启动一些新的worker 去做事。
Nginx多进程保证了多个worker之间是相互独立，一个worker退出不影响其它的worker。


<figure>
    <img src={require('./img/nginx进程模型.jpg').default}/>
    <center><figcaption>nginx进程模型</figcaption></center>
</figure>
假设Nginx启动以后，创建了3个Worker，当客户端有请求进入到Nginx的时候，每一个worker都要去争抢锁（该锁和客户端一一对应），抢到锁之后 client 和 worker1 会建立响应的关系，才能去处理来自客户端的请求。
<figure>
    <img src={require('./img/Nginx进程模型2.jpg').default}/>
    <center><figcaption>nginx处理请求的方式</figcaption></center>
</figure>
传统服务器采用同步阻塞的方式处理请求，必须等一个请求处理完毕之后才回去处理下一个请求。
<figure>
    <img src={require('./img/传统服务器处理请求的方式.jpg').default}/>
    <center><figcaption>传统服务器处理请求的方式</figcaption></center>
</figure>
Nginx采用异步非阻塞的方式处理请求。Nginx可以设置默认连接数，默认是1024。

```conf
events {
	# 默认使用epoll
	use epoll;
	# 每个worker允许连接的客户端最大连接数
	worker_connections 10240;
}

```
**总结** Nginx高性能的原因是采用了抢占机制和异步非阻塞的通信模式（多路复用器，在Netty里面会涉及到）。master是作为监听，当worker获得了client请求的时候，并且处理到了阻塞的部分，worker就不会继续等待该阻塞的请求，而是会处理一些其它的客户端的请求。
##